using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using NLog;
using System;
using FileSyncApp;

namespace FileSyncApp;

/// <summary>
/// FileSyncApp 应用程序主类
/// 继承自 Avalonia.Application，负责应用程序的初始化、配置和生命周期管理
/// </summary>
/// <remarks>
/// 此类处理应用程序级别的初始化工作，包括：
/// - XAML 资源加载
/// - 日志系统配置 (NLog)
/// - 主窗口创建和生命周期管理
/// - 跨平台兼容性处理（桌面和移动平台）
/// </remarks>
public partial class App : Application
{
    /// <summary>
    /// NLog 日志记录器实例
    /// 用于记录应用程序运行时的重要信息和错误
    /// </summary>
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();

    /// <summary>
    /// 应用程序初始化方法
    /// 在应用程序启动时调用，负责加载 XAML 资源和配置日志系统
    /// </summary>
    /// <remarks>
    /// 此方法执行以下初始化操作：
    /// 1. 加载 XAML 资源和样式
    /// 2. 配置 NLog 日志系统，设置日志文件路径和格式
    /// 3. 记录应用程序启动日志
    /// 
    /// 日志配置：
    /// - 日志文件路径: logs/app.log
    /// - 日志级别: Info 到 Fatal
    /// - 日志格式: 时间戳 + 级别 + 记录器名称 + 消息内容
    /// </remarks>
    public override void Initialize()
    {
        AvaloniaXamlLoader.Load(this);
        
        // 配置 NLog 日志系统
        var config = new NLog.Config.LoggingConfiguration();
        var fileTarget = new NLog.Targets.FileTarget("logfile")
        {
            FileName = "logs/app.log",
            Layout = "${longdate} ${level:uppercase=true} ${logger} ${message}"
        };
        config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, fileTarget);
        LogManager.Configuration = config;
        
        logger.Info("Avalonia GUI应用程序启动");
    }

    /// <summary>
    /// 框架初始化完成后的回调方法
    /// 负责创建和配置主窗口，处理不同平台的应用程序生命周期
    /// </summary>
    /// <remarks>
    /// 此方法执行以下操作：
    /// 1. 移除 Avalonia 默认的数据验证器，避免与自定义验证器冲突
    /// 2. 根据应用程序生命周期类型创建相应的主视图：
    ///    - 桌面应用程序：创建 MainWindow 作为主窗口
    ///    - 单视图应用程序（如移动平台）：创建 MainWindow 作为主视图
    /// 3. 根据配置决定是否在启动时最小化到系统托盘
    /// 4. 调用基类方法完成框架初始化
    /// 
    /// 支持的平台类型：
    /// - IClassicDesktopStyleApplicationLifetime: Windows, macOS, Linux 桌面应用
    /// - ISingleViewApplicationLifetime: iOS, Android 等移动平台应用
    /// </remarks>
    public override void OnFrameworkInitializationCompleted()
    {
        // 移除 Avalonia 数据验证器以避免重复验证
        // 如果不移除此行，将会从 Avalonia 和自定义验证器获得重复验证
        BindingPlugins.DataValidators.RemoveAt(0);

        // 根据应用程序生命周期类型创建主窗口
        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
        {
            // 桌面应用程序：设置主窗口
            var mainWindow = new MainWindow();
            desktop.MainWindow = mainWindow;
            
            // 根据配置决定启动时的窗口状态
            try
            {
                var configManager = new ConfigManager();
                var config = configManager.LoadConfig();
                
                if (!config.StartMinimized)
                {
                    // 如果配置为不最小化启动，则显示主窗口
                    mainWindow.WindowState = Avalonia.Controls.WindowState.Normal;
                    mainWindow.ShowInTaskbar = true;
                    logger.Info("应用程序启动时显示主窗口");
                }
                else
                {
                    // 最小化到托盘
                    logger.Info("应用程序启动时最小化到系统托盘");
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex, "加载启动配置失败，使用默认设置");
            }
        }
        else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
        {
            // 单视图应用程序（移动平台）：设置主视图
            singleViewPlatform.MainView = new MainWindow();
        }

        base.OnFrameworkInitializationCompleted();
    }
}